<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>LibQQt: 入门用法</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">LibQQt
   &#160;<span id="projectnumber">v3.1</span>
   </div>
   <div id="projectbrief">开源、跨平台Qt应用程序框架中间件</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">入门用法 </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="screenshot/1.png" alt="设置Qt Creator默认编译路径" title="这是Qt Creator的设置"/>
</div>
<p> <br />
Qt Creator <br />
Default build directory: <br />
/xxx/xxx/xxx/xxx/c0-buildstation 这是个你电脑上的绝对路径，根据自己把编译根放在哪里设置 <br />
/%{CurrentProject:Name}/%{CurrentKit:FileSystemName}/%{Qt:Version}/%{CurrentBuild:Name} 这里是个通配，直接拷贝上去 这是建议值，在Multi-link2.1里面，这个值不再强制。</p>
<div class="image">
<img src="screenshot/2.png" alt="设置Qt Creator构建套件" title="这是Qt Creator的设置，设置File System Name"/>
</div>
<p> <br />
</p><div class="image">
<img src="screenshot/3.png" alt="设置当前工程的环境变量" title="这是工程的环境变量设置，注意那几点"/>
</div>
<p> <br />
</p><div class="image">
<img src="screenshot/4.png" alt="链接QQt" title="这是链接QQt的方法，pri都在LibQQt目录里"/>
</div>
<p> <br />
</p><div class="image">
<img src="screenshot/5.png" alt="QQt内部pri的一点点设置" title="这是LibQQt需要设置的几个路径，编译路径，Sdk路径，发布路径"/>
</div>
<p> <br />
QQT_BUILD_ROOT = /Users/abel/Develop/c0-buildstation <br />
QQT_SDK_ROOT = /Users/abel/Develop/d1-product <br />
APP_DEPLOY_ROOT = /Users/abel/Develop/d1-product <br />
 </p><div class="image">
<img src="screenshot/6.png" alt="设置成功显示"/>
</div>
<p> <br />
如果设置成功，qmake应当显示如上例程的样子 <br />
 </p><h1>v2.1.6更新链接QQt的方法</h1>
<div class="image">
<img src="screenshot/7.png" alt="链接QQt" title="这是链接QQt的方法，pri都在LibQQt目录里"/>
</div>
<p> <br />
</p><div class="image">
<img src="screenshot/8.png" alt="QQt内部pri的设置" title="这是LibQQt需要设置的几个路径，这是新的版本，pri位置有改动"/>
</div>
<p> <br />
 </p><h1>主要使用思路</h1>
<ol type="1">
<li>按照文章所说，更改Qt Creator的默认编译路径。只有这样，才能实现多平台目标、中间目标不冲突。 <br />
2. 参照LibQQt/src/qqt_qkit.pri里的SYSNAME变量，在Qt Creator首选项-设置构建和运行-构建套件Kit页面的每个kit的File System Name。（请使用Qt Creator 3.5以上版本，其被佩戴于Qt5.2.） <br />
3. 打开LibQQt工程，根据qmake输出，在用户配置目录/[.]qmake/app_configure.pri里面设置QQT_BUILD_ROOT QQT_SDK_ROOT APP_DEPLOY_ROOT三个路径变量 <br />
4. 仿照LibQQt的例程，在用户工程.pro里include(.../LibQQt/multi-link/multi-link/add_base_manager.pri)<ul>
<li>如果需要跟随发布配置文件，按照图里的设置APP_CONFIG_PWD <br />
5. 在Qt Creator项目-kit-构建设置页面，配置QKIT环境变量（LibQQt也需要，用户App需要），可以build了。 <br />
 在LibQQt/app/xxx.pri，用户可以选用，拷贝到自己工程目录。 <br />
在这个过程里面，只有QKIT环境变量跟随工程build配置，其他的仅仅初始配置一次。 <br />
 <h1>Qt Kit、Kit File System Name和QKIT、SYSNAME的关系</h1>
</li>
</ul>
</li>
</ol>
<p>LibQQt有复杂的环境设置，那么这些设置之间的关系是什么样子的呢？ <br />
 </p><h4>先说说，每个value在Qt Creator中的位置</h4>
<ul>
<li>首选项-构建和运行-构建套件(Kit)-Every kit (初始化) <br />
 - File system name</li>
<li>项目-Every kit-构建设置-构建环境 （跟随build目标） <br />
 - QKIT <br />
- LibQQt/src/qqt_qkit.pri（定义之处） <br />
 - QKIT、SYSNAME的定义。 <br />
- 用户配置目录/[.]qmake/app_configure.pri（初始化） <br />
 - QQT_SDK_ROOT 所有SDK的发布根位置<ul>
<li>QQT_BUILD_ROOT 所有LibQQt应用的编译根位置</li>
<li>APP_DEPLOY_ROOT 所有LibQQt应用的发布根目录 <br />
 <h4>再说说，他们之间的对应关系</h4>
</li>
</ul>
</li>
</ul>
<table class="markdownTable">
<tr class="markdownTableHead">
<th class="markdownTableHeadNone">Qt Kit  </th><th class="markdownTableHeadNone" colspan="3">Kit File System Nam   </th></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Windows 32bit  </td><td class="markdownTableBodyNone">Windows  </td><td class="markdownTableBodyLeft">WIN32  </td><td class="markdownTableBodyLeft">Windows   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Windows 64bit  </td><td class="markdownTableBodyNone">Win64  </td><td class="markdownTableBodyLeft">WIN64  </td><td class="markdownTableBodyLeft">Win64   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Linux 32bit  </td><td class="markdownTableBodyNone">Linux  </td><td class="markdownTableBodyLeft">LINUX  </td><td class="markdownTableBodyLeft">Linux   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Linux 64bit  </td><td class="markdownTableBodyNone">Linux64  </td><td class="markdownTableBodyLeft">LINUX64  </td><td class="markdownTableBodyLeft">Linux64   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">macOS clang 64bit  </td><td class="markdownTableBodyNone">MacOS  </td><td class="markdownTableBodyLeft">macOS  </td><td class="markdownTableBodyLeft">MacOS   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Arm 32bit  </td><td class="markdownTableBodyNone">Arm32  </td><td class="markdownTableBodyLeft">ARM32  </td><td class="markdownTableBodyLeft">Arm32   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Mips 32bit  </td><td class="markdownTableBodyNone">Mips32  </td><td class="markdownTableBodyLeft">MIPS32  </td><td class="markdownTableBodyLeft">Mips32   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Embedded 32bit  </td><td class="markdownTableBodyNone">Embedded  </td><td class="markdownTableBodyLeft">EMBEDDED  </td><td class="markdownTableBodyLeft">Embedded   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">iOS clang  </td><td class="markdownTableBodyNone">iOS  </td><td class="markdownTableBodyLeft">iOS  </td><td class="markdownTableBodyLeft">iOS   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">iOS Simulator  </td><td class="markdownTableBodyNone">﻿iOS-simulator  </td><td class="markdownTableBodyLeft">iOSSimulator  </td><td class="markdownTableBodyLeft">iOS-simulator   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Android armeabi  </td><td class="markdownTableBodyNone">﻿Android  </td><td class="markdownTableBodyLeft">ANDROID  </td><td class="markdownTableBodyLeft">﻿Android   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Android x86  </td><td class="markdownTableBodyNone">﻿Android_x86  </td><td class="markdownTableBodyLeft">ANDROIDX86  </td><td class="markdownTableBodyLeft">﻿Android_x86   </td></tr>
</table>
<h4>最后说说，他们的决定关系和由来</h4>
<p>QKIT决定SYSNAME，SYSNAME等于Kit File System Name. <br />
Qt Kit的名字，第一列，就是Qt Creator的构建套件。 <br />
它每一个包含一个不同的系统名叫做File System Name，它还包括不同的编译器、调试器等。 <br />
有没有感觉他们的关系很逗？明明相同的东西，写了这么多遍。 <br />
原因是这样的， <br />
源代码-经过qmake变成-MakeFile-经过make变成-目标。 <br />
Qt Creator自己配置了Kit的很多变量，可是！没有全部传给qmake！ <br />
qmake拿不到完整的目标信息，只好自己定义一套，就是QKIT和SYSNAME， <br />
而Qt Creator这时就必须配合qmake完成配置。 <br />
Qt Creator里的两处配置都是为了配合qmake进行配置的， <br />
无奈之举。 <br />
等Qt Creator更新到把目标信息全部传给qmake以后，就可以删除QKIT和SYSNAME这样的设置了。 <br />
 用户设置的那几个路径属于Multi-link技术，每更换一台电脑才会更换。 <br />
目的在于确认用户的开发、工具、编译、产品目录的设置，用于辅助qmake执行多link。 <br />
 欢迎建筑工程师、机械工程师、电子工程师、软件工程师、美术工程师等技术人员，学习使用。 <br />
 </p><h1>v2.2.1更新链接LibQQt的方法</h1>
<p>磁盘上的和先前的没有变化，只不过用户在工程树里看到的app_configure.pri从app_link_qqt_library.pri里移动到了app_multi_link_config.pri里。 <br />
并且Multi-link技术主动依赖qqt_function.pri里的qmake用户自定义函数集。 <br />
图上写的比较简单，Windows下在，用户主目录\AppData\Roaming\qmake里。 </p><div class="image">
<img src="screenshot/9.png" alt="app_configure.pri移动了" title="这是LibQQt需要设置的几个路径，pri位置有改动"/>
</div>
<p> <br />
 </p><h1>v2.2.2 更新LibQQt Multi-link技术</h1>
<p>Windows平台app_configure.pri的位置 C:\Users\Administrator\AppData\qmake， <br />
在Windows下，Qt Creator还是不会在qmake error函数以后依然加载app_configure.pri， <br />
还是需要用户手动去打开这个文件进行编辑。 <br />
无奈之举。 <br />
 </p><div class="image">
<img src="screenshot/10.png" alt="app_configure.pri移动了" title="这是LibQQt需要设置的几个路径，pri位置有改动"/>
</div>
<p> <br />
 </p><h1>v2.4支持MSVC2015的一些注意事项</h1>
<p>用Qt VS Addin或者Qt VS Tools开发即可。 <br />
 有一些约束：</p><ul>
<li>源代码必须使用uft-8+bom的格式保存，否则Visual Studio对文本识别会出现混乱。 <br />
- 注意包含一下qqtcore.h，里边有一个针对msvc编译器选项，使exe里文本按照utf-8编码。 <br />
- 终端输出的时候，要用utf-8的代码页。 <br />
 Visual Studio使用设置： <br />
- 设置环境变量 <br />
 - 我使用Multi-environ Manager工具进行设置，语法不一样，但是思路一样。 <br />
 - QTVERSION : 5.8.0<ul>
<li>QTDIR : ${qt5.8.msvc}</li>
<li>BUILDTYPE : Debug</li>
<li>QKIT : WIN64</li>
<li>QSYS : Win64</li>
<li>QQT_STD_PWD : ${QTVERSION}/${QSYS}/${BUILDTYPE} <br />
 - QQT_BUILD_ROOT : C:-buildstation</li>
<li>QQT_SDK_ROOT : C:-product</li>
<li>路径<ul>
<li>${qt5.8.msvc.bin} <br />
 - ${QQT_SDK_ROOT}/QQt/${QQT_STD_PWD}/lib 可选</li>
</ul>
</li>
</ul>
</li>
<li>启动Visual Studio 2015 <br />
 - cd /d "${msvc2015}"" <br />
 - start devenv.exe <br />
 - 注意：Visual Studio 2015的启动环境为上述环境之中。 <br />
- Visual Studio 2015设置 <br />
 - 打开QQt.pro之后，sln工程自动生成 <br />
 - 设置调试-QQt属性-配置属性-常规 输出目录由bin\改为${QQT_BUILD_ROOT}$(QQT_STD_PWD)\<ul>
<li>启动生成，即可，QQt Lib和例程都可以正常生成。这个时候可以去产品输出目录点击运行。如果缺少部分QtLib，手动解决下。 <br />
 - App执行调试缺少QQt.dll，<ul>
<li>设置调试-App属性-配置属性-调试 环境 Path添加${QQT_SDK_ROOT}/QQt/${QQT_STD_PWD}/lib <br />
 - 如果想影响全局App调试，上边那个可选的路径加进环境变量Path里。 <br />
 - 这样调试App就可以开始了。 <br />
- 可以开始使用LibQQt编写自己的App了。 <br />
 还修改了Windows下的app_configure.pri的磁盘保存位置，到用户主目录/.qmake/app_configure.pri，这块完全使用类Unix风格。 <br />
 <h1>LibQQt v3.0</h1>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Multi-link技术完成。 <br />
在完成的Multi-link技术里，新的QSYS环境变量和Qt Kit的关系 <br />
QKIT不再使用，而仅仅使用QSYS。 <br />
 </p><table class="markdownTable">
<tr class="markdownTableHead">
<th class="markdownTableHeadNone">Qt Kit  </th><th class="markdownTableHeadNone" colspan="3">Kit File System Nam   </th></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Windows 32bit  </td><td class="markdownTableBodyNone">Windows  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Windows   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Windows 32bit  </td><td class="markdownTableBodyNone">Win32  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Win32   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Windows 64bit  </td><td class="markdownTableBodyNone">Win64  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Win64   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Linux 32bit  </td><td class="markdownTableBodyNone">Linux  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Linux   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Linux 64bit  </td><td class="markdownTableBodyNone">Linux64  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Linux64   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">macOS clang 64bit  </td><td class="markdownTableBodyNone">macOS  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">macOS   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Arm 32bit  </td><td class="markdownTableBodyNone">Arm32  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Arm32   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Mips 32bit  </td><td class="markdownTableBodyNone">Mips32  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Mips32   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Embedded 32bit  </td><td class="markdownTableBodyNone">Embedded  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">Embedded   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">iOS clang  </td><td class="markdownTableBodyNone">iOS  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">iOS   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">iOS Simulator  </td><td class="markdownTableBodyNone">﻿iOSSimulator  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">iOSSimulator   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowEven">
<td class="markdownTableBodyNone">Android armeabi  </td><td class="markdownTableBodyNone">﻿Android  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">﻿Android   </td></tr>
<tr class="markdownTableBody" class="markdownTableRowOdd">
<td class="markdownTableBodyNone">Android x86  </td><td class="markdownTableBodyNone">﻿AndroidX86  </td><td class="markdownTableBodyLeft">-  </td><td class="markdownTableBodyLeft">﻿AndroidX86   </td></tr>
</table>
<h4>使用场景截图</h4>
<div class="image">
<img src="screenshot/11.png" alt="使用场景" title="这是Multi-link技术的使用方式截图"/>
</div>
<p> <br />
 </p><h4>Multi-link技术能够达到的管理能力</h4>
<p>App和Lib的源代码，一直处于编写之中。 <br />
App和Lib的目标，一直从Build位置，持续发布到Deploy位置和SDK位置。 <br />
用户再也不必为了管理生成目标、发布目标和链接而劳费手劲。 <br />
在2008年的时候还没有这个技术，2018年，这个技术终于变成了现实。 <br />
现在，按照GPL发布， <br />
基于qmake。 <br />
</p><div class="image">
<img src="screenshot/12.png" alt="Multi-link技术的能力" title="这是Multi-link技术的能力"/>
</div>
<p> <br />
 </p><h4>多链接技术创造的生产线</h4>
<p>Multi-link会一直处于App/Lib生产线的控制器地位。 <br />
Multi-link允许用户自行添加任何依赖项，我把一些常用的依赖项添加用pri放在了app-lib里， 而这些依赖项的SDK我保存在了百度网盘，以方便用户取用，用户只需要下载下来解压到自己的LIB_SDK_ROOT里。 <br />
百度网盘地址链接：https://pan.baidu.com/s/1FPPkTUnk2XBL4rpnZsAGmw 密码：hotz <br />
SDK难免有不全，难免不能满足任何用户的需求，请用户自行补齐。 利用Multi-link技术的添加Library模板很容易的。 我计划在LibQQt 3.0的时机将Multi-link合并到master分支进行正式发布。 <br />
</p><div class="image">
<img src="screenshot/13.png" alt="Multi-link技术的能力" title="这是Multi-link技术的能力"/>
</div>
<p> <br />
</p>
<h4>多链接技术的一点设置</h4>
<div class="image">
<img src="screenshot/14.png" alt="Multilink的一点点设置" title="这是LibQQt使用的Multi-link需要设置的几个路径，编译路径，Sdk路径，发布路径"/>
</div>
<p> <br />
APP_DEPLOY_ROOT=R:-product <br />
LIB_SDK_ROOT=R:-sdk <br />
APP_BUILD_ROOT=R:-buildstation <br />
Multi-link目录里提供了Multi-linkConfigTool图形配置工具，编译运行就可以设置，非常方便。 <br />
在工程里包含multi-link/add_base_manager.pri，在project build config设置环境变量QSYS，就可以使用里面的丰富函数。简单吧！ <br />
*注意：Multi-link 2 已经不支持Qt4，如果需要Qt第四代，那么使用multi-link 1.0链接QQt。* <br />
*注意：Multi-link 2 APP_BUILD_ROOT变成了optional，但是依然需要设置一下，以免还有需要的地方。build root是一切开始的地方。* <br />
</p><div class="image">
<img src="screenshot/15.png" alt="qmake成功" title="这是LibQQt qmake成功的样子。"/>
</div>
<p> <br />
</p><div class="image">
<img src="screenshot/16.png" alt="qmake成功" title="这是Example app qmake成功的样子。"/>
</div>
<p> <br />
 Enjoy it! <br />
</p>
<p><a href=".">返回</a> </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.14
</small></address>
</body>
</html>
